Précedent Suivant Titre Sommaire

5 - LE SCRIPT DE GESTION DES UTILISATEURS LDAP :

Le script principal « gestion_ldap » est donné ci-dessous :
#!/bin/bash

# Script permet de lister, creer, modifier ou detruire des utilisateurs
# dans un annuaire LDAP
# Copyright marc.boget@gendarmerie.org

# Definition des valeurs par defaut
if [ "$BASEDN" == "" ]; then export BASEDN="ou=Maquette de test,o=sga";fi
if [ "$OU_USERS" == "" ]; then export OU_USERS="ou=People";fi
if [ "$OU_MACHINES" == "" ]; then export OU_MACHINES="ou=Ordinateurs";fi
if [ "$OU_GROUPS" == "" ]; then export OU_GROUPS="ou=Group";fi
#if [ "$BINDDN" == "" ]; then export BINDDN="uid=esentry,ou=Special Users,ou=Maquette de test,o=sga";fi
if [ "$BINDDN" == "" ]; then export BINDDN="cn=admin,ou=Maquette de test,o=sga";fi
if [ "$SERVEUR" == "" ]; then export SERVEUR="localhost";fi
if [ "$PORT" == "" ]; then export PORT="389";fi
if [ "$PASSWORD" == "" ]; then export PASSWORD="sga";fi
CHAMPS=""
if [ "$LDAPSEARCH" == "" ]; then LDAPSEARCH="/usr/bin/ldapsearch";fi
if [ "$LDAPDELETE" == "" ]; then LDAPDELETE="/usr/bin/ldapdelete";fi
if [ "$LDAPADDUSER" == "" ]; then LDAPADDUSER="./ldapadduser";fi
if [ "$LDAPADDALLUSERS" == "" ]; then LDAPADDALLUSERS="./ldapaddallusers";fi
if [ "$LDAPADDGROUP" == "" ]; then LDAPADDGROUP="./ldapaddgroup";fi
if [ "$OUT" == "" ]; then OUT="/dev/stdout";fi
if [ "$MK_NTPASSWD" == "" ]; then export MK_NTPASSWD="./mkntpwd";fi
SMB_HOME_TEMP="\\\\$(uname -n)"
if [ "$SMB_HOME" == "" ]; then export SMB_HOME="${SMB_HOME_TEMP}\homes";fi
if [ "$SMB_PROFILE" == "" ]; then export SMB_PROFILE="${SMB_HOME_TEMP}\profiles";fi
if [ "$SMB_DRIVE" == "" ]; then export SMB_DRIVE="Z:";fi
export TYPE_CREATION=""
ALL_USERS="no"
INTERACTIF="no"
PASS_MODE="no"

# Definition fichier de travail temporaire
export FICHIER_TEMP_USERS="personnel.tmp"
export FICHIER_TEMP_GROUPS="groups.tmp"

#Recuperation des arguments de la ligne de commande

ARGS=$(getopt -o k:ihlgamdf:as:D:b:w::p:t: --longoptions type:,interactif,help,list,append,modify,delete,groups,file:,server:,binddn:,basedn:,password::,port:,path_ldapsearch:,ou_users:,ou_groups:,ou_machines:,out:,ldapadduser:,ldapallusers:,ldapdelete:,allusers,gid:,pass,mkntpwd,smbhome:,smbprofile:,smbdrive:,uid:,ag -- "$@")

eval set -- "$ARGS"
while true
do
	case "$1" in
		-l|--list)		OPT="List";
						shift ;;
		-g|--groups)	OPT="Listgroups";
						shift ;;
		-a|--append)	OPT="Append";
						shift ;;
		-m|--modify)	OPT="Modify";
						shift ;;
		-d|--delete)	OPT="Delete";
						shift ;;
		--ag)			OPT="AddGroup";
						shift ;;
		-s|--server)	SERVEUR=$2;
						shift 2 ;;
		-p|--port)		PORT=$2;
						shift 2 ;;
		-b|--basedn)	BASEDN=$2;
						shift 2 ;;
		-D|--binddn)	BINDDN=$2;
						shift 2 ;;
		-w|--password)	case "$2" in
							"") echo -n "Mot de passe de connexion : " ; 
							    read PASSWORD ;
								shift 2 ;;
							*) PASSWORD=$2 ; shift 2 ;;
						esac ;;
		--gid)			GIDNUMBER=$2;
						shift 2 ;;
		--uid)			UIDNUMBER=$2;
						shift 2 ;;
		--ldapsearch)	LDAPSEARCH=$2;
						shift 2 ;;
		--ldapadduser)	LDAPADDUSER=$2;
						shift 2 ;;
		--ldapallusers)	LDAPADDALLUSERS=$2;
						shift 2 ;;
		--ldapaddgroup)	LDAPADDGROUP=$2;
						shift 2 ;;
		--ou_users)		OU_USERS=$2;
						shift 2 ;;
		--ou_groups)	OU_GROUPS=$2;
						shift 2 ;;
		--ou_machines)	OU_MACHINES=$2;
						shift 2 ;;
		--out)			OUT=$2;
						shift 2 ;;
		-f|--file)		FICHIER=$2;
						shift 2 ;;
		-i|--interactif) INTERACTIF="yes";
						shift;;
		-t|--type)		TYPE_CREATION=$2;
						shift 2 ;;
		-k|--mkntpwd)	MK_NTPASSWD=$2;
						shift 2 ;;
		--smbhome)		SMB_HOME=$2;
						shift 2 ;;
		--smbprofile)	SMB_PROFILE=$2;
						shift 2 ;;
		--smbdrive)		SMB_DRIVE=$2;
						shift 2 ;;
		--allusers)		ALL_USERS="yes";
						shift ;;
		--pass)			PASS_MODE="yes";
						shift ;;
		--)				shift ; break ;;
		-h|--help)		echo "Gestion des utilisateurs sur un annuaire LDAP" ;
						echo "Usage : [l|gamdfsDbwp] [champs_recherches][utilisateur][mot_passe]" ;
						echo "   -l|--list      : liste des utilisateurs" ;
						echo "   -g|--groups    : liste des groupes d'utilisateurs" ;
						echo "   -a|--append    : ajout d'utilisateur" ;
						echo "   -m|--modify    : modification d'utilisateur" ;
						echo "   -d|--delete    : destruction d'utilisateur" ;
						echo "   -f|--file      : fichier de definition des utilisateurs" ;
						echo "   -i|--interactif: lancement en mode interactif" ;
						echo "   -s|--server    : serveur LDAP a contacter" ;
						echo "   -D|--binddn    : utilisateur a utiliser pour se connecter" ;
						echo "   -w|--password  : mot de passe a utiliser pour se connecter" ;
						echo "   -p|--port      : port d'ecoute du serveur LDAP" ;
						echo "   -k|--mkntpwd   : utilitaire mkntpwd a utiliser (avec chemin complet)" ;
						echo "   -t|--type      : type d'utilisateur/machine a creer : " ;
						echo "         - person : utilisateur de type personnel " ;
						echo "         - unix   : utilisateur pouvant se connecter sur Unix" ;
						echo "         - samba  : utilisateur pouvant se connecter sur Samba" ;
						echo "         - sambix : utilisateur pouvant se connecter sur Unix + Samba (Defaut)" ;
						echo "         - machine: machine faisant partie du domaine Samba" ;
						echo "   --gid          : Numero du groupe a utiliser" ;
						echo "   --uid          : Numero de l'utilisateur a utiliser" ;
						echo "   --ldapsearch   : utilitaire ldapsearch a utiliser (avec chemin complet)" ;
						echo "   --ldapdelete   : utilitaire ldapdelete a utiliser (avec chemin complet)" ;
						echo "   --ldapadduser  : script perl pour ajout utilisateurs (avec chemin complet)" ;
						echo "   --ldapallusers : script perl pour ajout /etc/paswd (avec chemin complet)" ;
						echo "   --ldapaddgroup : script perl pour ajout groupes (avec chemin complet)" ;
						echo "   --ou_users     : OU contenant les utilisateurs (ou=People par defaut)" ;
						echo "   --ou_groups    : OU contenant les groupes (ou=Group par defaut)" ;
						echo "   --ou_machines  : OU contenant les ordinateurs du domaine Samba                                   (ou=Ordinateurs par defaut)" ;
						echo "   --out          : Fichier de sortie des resultats (stdout par defaut)" ;
						echo "   --smbhome      : Repertoire home utilisateurs samba" ;
						echo "                    ($SMB_HOME par defaut)" ;
						echo "   --smbprofile   : Repertoire profils utilisateurs samba" ;
						echo "                    ($SMB_PROFILE par defaut)" ;
						echo "   --smbdrive     : Lecteur reseau repertoire utilisateur samba (Z: par defaut)" ;
						echo "   --allusers     : incorporation de l'ensemble des utilisateurs de /etc/passwd" ;
						echo "   --pass         : changement du mot de passe" ;
						echo ""
						echo "   champs_recherches : option utilisée avec options 'l' et 'g'"
						echo "          - tous les champs par defaut"
						echo "          - peuvent etre definis sous la forme champ1 champ2 ... champn"
						echo ""
						echo "   utilisateur : nom utilisateur a creer/detruire"
						echo ""
						echo "   mot_passe   : mot de passe en clair de l'utilisateur a creer"
						exit 1 ;;
		*) 				echo "Aide";
						exit 1 ;;
	esac
done

# Recuperation du dn d'un utilisateur donné
function recuperation_dn()
{
	variable=$($LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_USERS,$BASEDN" "uid=$NOM_UTILISATEUR" dn|grep "^dn:"|cut -c "5-")
}

# Traitement du changement de mot de passe
if [ "$PASS_MODE" == "yes" ]
then
		NOM_UTILISATEUR=$1
		if [ "$NOM_UTILISATEUR" == "" ]
		then
			NOM_UTILISATEUR=$(whoami)
		fi
		recuperation_dn
		export DN_UTILISATEUR=$variable
		echo -n "Entrer l'ancien mot de passe pour utilisateur $NOM_UTILISATEUR : "
		# Desactivation de l'echo local
		stty -echo
		read OLD_PASSWORD_USER
		# Reactivation de l'echo local
		stty echo
		echo ""
		echo -n "Entrer le nouveau mot de passe  pour utilisateur $NOM_UTILISATEUR : "
		# Desactivation de l'echo local
		stty -echo
		read NEW_PASSWORD_USER1
		# Reactivation de l'echo local
		stty echo
		echo ""
		echo -n "Retaper le mot de passe pour verification : "
		# Desactivation de l'echo local
		stty -echo
		read NEW_PASSWORD_USER2
		echo ""
		# Reactivation de l'echo local
		stty echo
		if [ "$NEW_PASSWORD_USER1" != "$NEW_PASSWORD_USER2" ]
		then
			echo "Les deux mots de passe ne sont pas indentiques !!!"
			exit -1
		fi
		export TYPE_CREATION="password"
		export NEW_PASSWORD_USER1
		$LDAPSEARCH -x -w "$OLD_PASSWORD_USER" -D "uid=$NOM_UTILISATEUR,$OU_USERS,$BASEDN" -b "$OU_USERS,$BASEDN" "uid=$NOM_UTILISATEUR" > /dev/null 2>&1 && $LDAPADDUSER && echo "Changement mot de passe effectue ..." || echo "Mot de passe incorrect !!!"
fi

# Traitement du mode interactif
if [ "$INTERACTIF" == "yes" ]
then
	while [ "$OPT" == "" ]
	do
		echo -n "Option de lancement (List/Listgroups/Append/Modify/Delete/AddGroup) : " 
		read OPT 
		if    [ "$OPT" != "List" ] && [ "$OPT" != "Listgroups" ] \
		   && [ "$OPT" != "Append" ] && [ "$OPT" != "Modify" ] \
		   && [ "$OPT" != "Delete" ]  && [ "$OPT" != "AddGroup" ]
		then
			OPT=""
		fi
	done
	while [ "$TYPE_CREATION" == "" ]
	do
		echo -n "Type d'utilisateur/machine a creer (person/unix/samba/sambix/machine) : " 
		read TYPE_CREATION 
		if [ "$TYPE_CREATION" != "person" ] && \
		   [ "$TYPE_CREATION" != "unix" ] && \
		   [ "$TYPE_CREATION" != "samba" ] && \
		   [ "$TYPE_CREATION" != "sambix" ] && \
		   [ "$TYPE_CREATION" != "machine" ]
		then
			TYPE_CREATION=""
		fi
	done
	echo -n "Fichier de definition des utilisateurs (personnel.lst) : " 
		read FICHIER 
		if [ "$FICHIER" == "" ]; then FICHIER="personnel.lst"; fi
	echo -n "Utilitaire ldapsearch (/usr/bin/ldapsearch) : " 
		read LDAPSEARCH 
		if [ "$LDAPSEARCH" == "" ]; then LDAPSEARCH="/usr/bin/ldapsearch"; fi
	echo -n "Utilitaire ldapdelete (/usr/bin/ldapdelete) : " 
		read LDAPDELETE 
		if [ "$LDAPDELETE" == "" ]; then LDAPDELETE="/usr/bin/ldapdelete"; fi
	echo -n "Script perl pour ajout utilisateurs (./ldapadduser) : " 
		read LDAPADDUSER 
		if [ "$LDAPADDUSER" == "" ]; then LDAPADDUSER="./ldapadduser"; fi
	echo -n "Script perl pour ajout groupes (./ldapaddgroup) : " 
		read LDAPADDGROUP 
		if [ "$LDAPADDGROUP" == "" ]; then LDAPADDGROUP="./ldapaddgroup"; fi
	echo -n "Script perl pour ajout /etc/passwd (./ldapaddallusers) : " 
		read LDAPADDALLUSERS 
		if [ "$LDAPADDALLUSERS" == "" ]; then LDAPADDALLUSERS="./ldapaddallusers"; fi
	echo -n "Fichier de sortie des resultats (/dev/stdout) : " 
		read OUT 
		if [ "$OUT" == "" ]; then OUT="/dev/stdout"; fi
	echo -n "Serveur LDAP (localhost) : " 
		read SERVEUR 
		if [ "$SERVEUR" == "" ]; then SERVEUR="localhost"; fi
	echo -n "Port LDAP (389) : " 
		read PORT 
		if [ "$PORT" == "" ]; then PORT="389"; fi
	echo -n "Racine LDAP (ou=Maquette de test,o=sga) : " 
		read BASEDN 
		if [ "$BASEDN" == "" ]; then BASEDN="ou=Maquette de test,o=sga"; fi
	echo -n "Unite d'organisation LDAP contenant les utilisateurs (ou=People) : " 
		read OU_USERS 
		if [ "$OU_USERS" == "" ]; then OU_USERS="ou=People"; fi
	echo -n "Unite d'organisation LDAP contenant les groupes (ou=Group) : " 
		read OU_GROUPS 
		if [ "$OU_GROUPS" == "" ]; then OU_GROUPS="ou=Group"; fi
	echo -n "Unite d'organisation LDAP contenant les ordinateurs (ou=Ordinateurs) : " 
		read OU_MACHINES
		if [ "$OU_GROUPS" == "" ]; then OU_GROUPS="ou=Group"; fi
	echo -n "Utilisateur LDAP pour se connecter (uid=esentry,ou=Special Users,ou=Maquette de test,o=sga) : " 
		read BINDDN 
		if [ "$BINDDN" == "" ]; then BINDDN="uid=esentry,ou=Special Users,ou=Maquette de test,o=sga"; fi
fi

# Verification du type d'utilisateur a creer
if [ "$TYPE_CREATION" == "" ]; then TYPE_CREATION="sambix"; fi

# Recuperation des champs a visualiser ou des utilisateurs a creer/detruire
CHAMPS="$1"
if [ "$OPT" == "Append" ] || [ "$OPT" == "Modify" ]
then
	if [ "$FICHIER" == "" ] && [ "TYPE_CREATION" != "machine" ]
	then
		if [ "ALL_USERS" == "" ]
		then
			if [ "$GIDNUMBER" == "" ]
			then
				echo ""
				echo "Le numero de groupe d'appartenance de l'utilisateur est requis !!!"
				exit -1
			fi
			NOM_UTILISATEUR=$1
			PASSWORD_UTILISATEUR=$2
		fi
	fi
fi

# Definition des fonctions de calcul

# Recuperation du premier uid machine libre
function new_uid_machine()
{
	variable=$($LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_MACHINES,$BASEDN" uidNumber |grep "^uidNumber" |cut -d':' -f2|grep -v "65534"|sort -n|tail -1|cut -d' ' -f2)
	# Cas ou il n'existe aucun utilisateur ds l'annuaire
	if [ "$variable" == "" ]
	then
		variable="1000"
	else
		variable="$(expr $variable + 1 )"
	fi
	return $variable;
}

# Recuperation du premier uid utilisateur libre
function new_uid()
{
	variable=$($LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_USERS,$BASEDN" uidNumber |grep "^uidNumber" |cut -d':' -f2|grep -v "65534"|sort -n|tail -1|cut -d' ' -f2)
	# Cas ou il n'existe aucun utilisateur ds l'annuaire
	if [ "$variable" == "" ]
	then
		variable="1000"
	else
		variable="$(expr $variable + 1 )"
	fi
	return $variable;
}

# Recuperation du premier gid libre
function new_gid()
{
	variable=$($LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_GROUPS,$BASEDN" gidNumber |grep "^gidNumber" |cut -d':' -f2|grep -v "65534"|sort -n|tail -1|cut -d' ' -f2)
	# Cas ou il n'existe aucun groupe ds l'annuaire
	if [ "$variable" == "" ]
	then
		variable="1000"
	else
		variable="$(expr $variable + 1 )"
	fi
	return $variable;
}
# Recherche du gidNumber correspondant a un groupe donne
function recherche_gid()
{
	variable=$($LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_GROUPS,$BASEDN" "cn=$USER_GROUPE" |grep "^gidNumber" |cut -d':' -f2|cut -d' ' -f2)
	return $variable;
}

# Remise a zero des champs utilisateur
function raz_champs()
{
	USER_CN=""
	USER_GROUPE=""
	USER_PASSWORD=""
	USER_SN=""
	USER_HOME=""
	USER_LOGIN=""
}
# Fonction de creation de groupe si besoin est
function creation_groupe()
{
	# Si le GIDNUMBER n'est pas fixe dans la ligne de commande
	# Recherche du gidNumber correspondant au groupe demandé
	# Si existe pas alors creation nouveau groupe
	if [ "$GIDNUMBER" == "" ]
	then
		recherche_gid
		GID=$variable
	else
		GID=$GIDNUMBER
	fi
	if [ "$GID" == "" ]
	then
		new_gid
		GID=$variable
		echo "$USER_GROUPE:$GID" >> $FICHIER_TEMP_GROUPS
	fi
}

# Fonction ajout de machines au domaine
function ajout_machines()
{
	# Effacement des fichiers de travail temporaires
	rm -f $FICHIER_TEMP_USERS
	rm -f $FICHIER_TEMP_GROUPS

	# Calcul du numero uid de depart
	if [ "$UIDNUMBER" == "" ]
	then
		new_uid_machine
		USER_ID=$variable
	else
		USER_ID=$UIDNUMBER
	fi
	# Destruction prealable de la machine si modification demandée
	if [ "$AJOUT" == "0" ]; then destruction_machine; fi
		
	NOM_UTILISATEUR="${CHAMPS}$"
	USER_CN=$NOM_UTILISATEUR
	USER_PASSWORD=$PASSWORD_UTILISATEUR
	USER_SN=$NOM_UTILISATEUR
	USER_HOME="/dev/null"
	USER_LOGIN="/bin/false"
	USER_GROUPE="users"
	
	creation_groupe
	
	# Ecriture du fichier de definition des machines
	# sous la forme cn;uid;gid;password;sn;home;login shell
	echo "$USER_CN:$USER_ID:$GID:$USER_PASSWORD:$USER_SN:$USER_HOME:$USER_LOGIN" >> $FICHIER_TEMP_USERS
	# Appel du script perl permettant de creer la machine
	$LDAPADDUSER
	# Appel du script perl permettant de creer les nouveaux groupes
	# Test : FICHIER_TEMP_GROUPS present
	if test -f $FICHIER_TEMP_GROUPS
	then
		$LDAPADDGROUP
	fi
	return 0
}


# Fonction permettant d'ajouter des utilisateurs
function ajout_utilisateurs()
{
	# Effacement des fichiers de travail temporaires
	rm -f $FICHIER_TEMP_USERS
	rm -f $FICHIER_TEMP_GROUPS

	# Sauvegarde du contexte 
	OLD_IFS=$IFS
	IFS=$'\n'
	# Calcul du numero uid de depart
	if [ "$UIDNUMBER" == "" ]
	then
		new_uid
		USER_ID=$variable
	else
		USER_ID=$UIDNUMBER
	fi

	# Explosion des lignes du fichier $FICHIER
	# les lignes sont sous la forme : 
	# nom_utilisateur;groupe;password;sn;home;login shell
	# Cas ou option all_users selectionnee
	if [ "$ALL_USERS" == "yes" ]
	then
		FICHIER=/etc/passwd
	fi

	# Traitement du cas ou le nom de l'utilisateur est donne en ligne de commande
	if [ "$FICHIER" == "" ]
	then
		# Destruction prealable de l'utilisateur si modification demandée
		if [ "$AJOUT" == "0" ]; then destruction_utilisateur; fi
		
		NOM_UTILISATEUR=$CHAMPS
		USER_CN=$NOM_UTILISATEUR
		USER_PASSWORD=$PASSWORD_UTILISATEUR
		USER_SN=$NOM_UTILISATEUR
		USER_HOME="/home/$NOM_UTILISATEUR"
		USER_LOGIN="/bin/bash"
		USER_GROUPE="$NOM_UTILISATEUR"

		creation_groupe

		# Ecriture du fichier de definition des utilisateurs
		# sous la forme cn;uid;gid;password;sn;home;login shell
		echo "$USER_CN:$USER_ID:$GID:$USER_PASSWORD:$USER_SN:$USER_HOME:$USER_LOGIN" >> $FICHIER_TEMP_USERS
		# Appel du script perl permettant de creer l'utilisateur
		$LDAPADDUSER
		# Appel du script perl permettant de creer les nouveaux groupes
		# Test : FICHIER_TEMP_GROUPS present
		if test -f $FICHIER_TEMP_GROUPS
		then
			$LDAPADDGROUP
		fi
		return 0
	fi

	for LIGNE in $(cat $FICHIER|grep -v "^#"|grep [:alnum:])
	do
		IFS=":"
		set $LIGNE
		# Mise a zero et initialisation des champs de l'utilisateur
		raz_champs
		# Cas ou option all_users selectionnee
		if [ "$ALL_USERS" == "yes" ]
		then
			USER_CN=$1
			USER_PASSWORD=$(grep "^$USER_CN:" /etc/shadow|cut -d':' -f2)
			USER_ID=$3
			GID=$4
			USER_SN=$5
			USER_HOME=$6
			USER_LOGIN=$7
		else
			USER_CN=$1
			USER_GROUPE=$2
			USER_PASSWORD=$3
			USER_SN=$4
			USER_HOME=$5
			USER_LOGIN=$6
			
			creation_groupe

		fi
		# Mise a jour du sn au cn par defaut
		if [ "$USER_SN" == "" ]
		then
			USER_SN="$USER_CN"
		fi

		# Destruction prealable de l'utilisateur si modification demandée
		if [ "$AJOUT" == "0" ]
		then
			CHAMPS=$USER_CN
			destruction_utilisateur
		fi
		
		# Ecriture du fichier de definition des utilisateurs
		# sous la forme cn;uid;gid;password;sn;home;login shell
		echo "$USER_CN:$USER_ID:$GID:$USER_PASSWORD:$USER_SN:$USER_HOME:$USER_LOGIN" >> $FICHIER_TEMP_USERS
		USER_ID="$(expr $USER_ID + 1 )"
	done
	# Restauration du contexte
	IFS=$OLD_IFS
	# Appel du script perl permettant de creer les utilisateurs
	if [ "$ALL_USERS" == "yes" ]
	then
		$LDAPADDALLUSERS
	else
		$LDAPADDUSER
	fi
	# Appel du script perl permettant de creer les nouveaux groupes
	# Test : FICHIER_TEMP_GROUPS present
	if test -f $FICHIER_TEMP_GROUPS
	then
		$LDAPADDGROUP
	fi
}

# Fonction permettant de detruire une machine
function destruction_machine()
{
	$LDAPDELETE -x -w "$PASSWORD" -D "$BINDDN" "uid=$CHAMPS,$OU_MACHINES,$BASEDN" 
}

# Fonction permettant de detruire un utilisateur
function destruction_utilisateur()
{
	$LDAPDELETE -x -w "$PASSWORD" -D "$BINDDN" "uid=$CHAMPS,$OU_USERS,$BASEDN" 
}

# Traitement des commandes
case $OPT in
	List)		
				$LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_USERS,$BASEDN" $CHAMPS > $OUT ;
				;;
	Listgroups)	
				$LDAPSEARCH -x -w "$PASSWORD" -D "$BINDDN" -b "$OU_GROUPS,$BASEDN" $CHAMPS > $OUT ;
				;;
	Append)		AJOUT=1
				if [ "$TYPE_CREATION" != "machine" ]
				then
					ajout_utilisateurs
				else
					ajout_machines
				fi
				;;
	Delete)		if [ "$CHAMPS" == "" ]
				then
					echo "Nom de l'utilisateur a detruire manquant"
					exit 1
				fi
				destruction_utilisateur
				;;
	Modify)		AJOUT=0
				ajout_utilisateurs
				;;
	AddGroup)	USER_GROUPE=$CHAMPS
				creation_groupe
				if test -f $FICHIER_TEMP_GROUPS
				then
					$LDAPADDGROUP
				fi
				;;
esac

rm -f $FICHIER_TEMP_USERS
rm -f $FICHIER_TEMP_GROUPS


NB : Ce script accepte les options ci-dessous :

Usage : [l|gamdfsDbwp] [champs_recherches][utilisateur][mot_passe]
   -l|--list     	:	liste des utilisateurs
   -g|--groups   	:	liste des groupes d'utilisateurs
   -a|--append    	:	ajout d'utilisateur
   -m|--modify    	:	modification d'utilisateur
   -d|--delete    	:	destruction d'utilisateur
   -f|--file      	:	fichier de definition des utilisateurs
   -i|--interactif	:	lancement en mode interactif
   -s|--server    	:	serveur LDAP a contacter
   -D|--binddn   	:	utilisateur a utiliser pour se connecter
   -w|--password 	:	mot de passe a utiliser pour se connecter
   -p|--port     	:	port d'ecoute du serveur LDAP
   -k|--mkntpwd  	:	utilitaire mkntpwd a utiliser (avec chemin complet)
   -t|--type     	:	type d'utilisateur/machine a creer :
         - person 	:	utilisateur de type personnel
         - unix   	:	utilisateur pouvant se connecter sur Unix
         - samba  	:	utilisateur pouvant se connecter sur Samba
         - sambix 	:	utilisateur pouvant se connecter sur Unix + Samba (Defaut)
         - machine	:	machine faisant partie du domaine Samba
   --gid          	:	Numero du groupe a utiliser
   --uid          	:	Numero de l'utilisateur a utiliser
   --ldapsearch   	:	utilitaire ldapsearch a utiliser (avec chemin complet)
   --ldapdelete  	:	utilitaire ldapdelete a utiliser (avec chemin complet)
   --ldapadduser  	:	script perl pour ajout utilisateurs (avec chemin complet)
   --ldapallusers 	:	script perl pour ajout /etc/paswd (avec chemin complet)
   --ldapaddgroup 	:	script perl pour ajout groupes (avec chemin complet)
   --ou_users     	:	OU contenant les utilisateurs (ou=People par defaut)
   --ou_groups    	:	OU contenant les groupes (ou=Group par defaut)
   --ou_machines 	:	OU contenant les ordinateurs du domaine Samba (ou=Ordinateurs par defaut)
   --out         	:	Fichier de sortie des resultats (stdout par defaut)
   --smbhome     	:	Repertoire home utilisateurs samba
                    (\\GrandeOurse\homes par defaut)
   --smbprofile  	:	Repertoire profils utilisateurs samba
                    (\\GrandeOurse\profiles par defaut)
   --smbdrive    	:	Lecteur reseau repertoire utilisateur samba (Z: par 
		defaut)
   --allusers    	:	incorporation de l'ensemble des utilisateurs de 
		/etc/passwd
   --pass         	:	changement du mot de passe

   champs_recherches : option utilisée avec options 'l' et 'g'
          - tous les champs par defaut
          - peuvent etre definis sous la forme champ1 champ2 ... champn

   utilisateur 	:	nom utilisateur a creer/detruire

   mot_passe   	:	mot de passe en clair de l'utilisateur a creer

Il peut s’appuyer sur un fichier de définition dont un exemple est donné ci-dessous :
# Fichier de definition des utilisateurs a creer dans l'annuaire LDAP
# Ce fichier sert de base pour gestion_ldap
# Les lignes doivent etre de la forme :
# nom:nom_groupe:mot_passe:nom_complet:home_directory:login_shell


user_test:groupe_test:sga:Utilisateur de Test:/home/user_test:/bin/bash

Il s’appuie sur les scripts perl « ldapadduser » « ldapaddgroup » et « ldapaddallusers » donnés ci-dessous :
#!/usr/bin/perl -w
#
# Script permettant de creer les utilisateurs dans l'annuaire LDAP
# Copyright marc.boget@gendarmerie.org
# Script fonctionnant de pair avec le script maitre gestion_ldap

#use strict;
use Net::LDAP;

# Recuperation des variables environnements exportes par gestion_ldap
my $serveur=$ENV{"SERVEUR"};
my $binddn=$ENV{"BINDDN"};
my $basedn=$ENV{"BASEDN"};
my $password=$ENV{"PASSWORD"};
my $ou_users=$ENV{"OU_USERS"};
my $ou_machines=$ENV{"OU_MACHINES"};
my $fichier_travail=$ENV{"FICHIER_TEMP_USERS"};
my $shadow_lastchange="11111";
my $shadow_max="99999";
my $shadow_warning="7";
my $type_creation=$ENV{"TYPE_CREATION"};
my $mk_ntpasswd=$ENV{"MK_NTPASSWD"};
my $home_rep_samba=$ENV{"SMB_HOME"};
my $home_drive_samba=$ENV{"SMB_DRIVE"};
my $profile_rep_samba=$ENV{"SMB_PROFILE"};

# Ouverture de la connexion sur l'annuaire LDAP
my $ldap = Net::LDAP->new($serveur, async => 1) or die "$@";

# on se connecte avec le BINDDN
$ldap->bind(dn=>$binddn,
	    password=>$password)  or die "$@";

# Traitement du changement du mot de passe
if ($type_creation =~ "password")
{
	# Generation du mot de passe chiffré
	my $pass=$ENV{"NEW_PASSWORD_USER1"};
    my $dn =$ENV{"DN_UTILISATEUR"};
    $salt=substr(rand 100,0,2);
    $pw=crypt($pass,$salt);
    my $userpassword="{crypt}$pw";
	
	# Calcul du mot de passe LanManager et du mot de passe NT
	# a l'aide de l'outil mkntpasswd (source LophtCrack)
	my $ntpwd=`$mk_ntpasswd '$pass'`;
	chomp(my $lmpassword=substr($ntpwd,0,index($ntpwd,':')));
	chomp(my $ntpassword=substr($ntpwd,index($ntpwd,':')+1));

   	my $res = $ldap->modify(dn=>$dn, 
			changes => [ 
				replace => [ "userPassword" => [ $userpassword ]
				           ]
			           ]
			               );
   	$res->code && warn "Erreur lors de la modification du mot de passe : ", $res->error ;
   	$res = $ldap->modify(dn=>$dn, 
			changes => [ 
				replace => [ "lmPassword" => [ $lmpassword ]
						   ]
			           ]
		                );
   	$res->code && warn "Erreur lors de la modification du mot de passe : ", $res->error ;
   	$res = $ldap->modify(dn=>$dn, 
			changes => [ 
				replace => [ "ntPassword" => [ $ntpassword ]
				           ]
			           ]
			                );
   	$res->code && warn "Erreur lors de la modification du mot de passe : ", $res->error ;
	exit;
}

# on lit un fichier qui contient les personnes à créer dans l'annuaire
open (FILE, "<$fichier_travail");

my $line;
while (defined ($line = <FILE>))
{
    chomp($line);
    if ($line =~ /^\s*$/)
    {
	next;
    }
    my ($uid, $uidNumber, $gidNumber, $pass, $sn, $home_rep, $login_shell) = split(/:/, $line);
    my $dn = "uid=$uid,$ou_users,$basedn";
	# Generation du mot de passe chiffré
    $salt=substr(rand 100,0,2);
    $pw=crypt($pass,$salt);
    my $userpassword="{crypt}$pw";
	SWITCH:
	{
		if ($type_creation =~ "person") 
			{
    			my $res = $ldap->add(dn=>$dn, 
					 attrs =>
					 [ "objectclass" => [ 'InetOrgPerson' ],
				   "uid" => [ $uid ],
				   "cn" => [ $uid ],
				   "sn" => [ $sn ]]);
    			$res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;
				last SWITCH;
			}

		if ($type_creation =~ "sambix") 
			{
				my $winmagic=2147483647;
				# Calcul du rid de l'utilisateur et du primaryGroupId
				# userRid=2*uidNumber + 1000
				# groupId=2*gidNumber + 1001
				my $userRid = 2 * $uidNumber + 1000;
				my $userGroupRid = 2 * $gidNumber + 1001;

				# Calcul du mot de passe LanManager et du mot de passe NT
				# a l'aide de l'outil mkntpasswd (source LophtCrack)
				my $ntpwd=`$mk_ntpasswd '$pass'`;
				chomp(my $lmpassword=substr($ntpwd,0,index($ntpwd,':')));
				chomp(my $ntpassword=substr($ntpwd,index($ntpwd,':')+1));
			
				# Mise a jour du samba home
				$home_rep_samba="$home_rep_samba\\$uid";
				print("home_rep=$home_rep_samba\n");
    			my $res = $ldap->add(dn=>$dn, 
					 attrs =>
					 [ "objectclass" => [ 'InetOrgPerson', 'account', 'posixAccount', 'top', 'shadowaccount', 'sambaAccount' ],
				   "uid" => [ $uid ],
				   "cn" => [ $uid ],
				   "sn" => [ $sn ],
				   "userPassword" => [ $userpassword ],
				   "shadowLastChange" => [ $shadow_lastchange ],
				   "shadowMax" => [ $shadow_max ],
				   "shadowWarning" => [ $shadow_warning ],
				   "loginShell" => [ $login_shell ],
				   "uidNumber" => [ $uidNumber ],
				   "gidNumber" => [ $gidNumber ],
				   "homeDirectory" => [ $home_rep ],
				   "gecos" => [ $uid ],
				   "description" => [ "Utilisateur SAMBA $sn" ],
				   "pwdLastSet" => [ '0' ],
				   "logonTime" => [ '0' ],
				   "logoffTime" => [ $winmagic ],
				   "kickoffTime" => [ $winmagic ],
				   "pwdCanChange" => [ '0' ],
				   "pwdMustChange" => [ $winmagic ],
				   "displayName" => [ $uid ],
				   "acctFlags" => [ '[UX       ]' ],
				   "rid" => [ $userRid ],
				   "primaryGroupID" => [ $userGroupRid ],
				   "smbHome" => [ $home_rep_samba ],
				   "lmPassword" => [ $lmpassword ],
				   "ntPassword" => [ $ntpassword ],
				   "homeDrive" => [ $home_drive_samba ],
				   "profilePath" => [ $profile_rep_samba ]
				   ]);
    			$res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;
				last SWITCH;
			}

		if ($type_creation =~ "machine") 
			{
    			my $dn = "uid=$uid,$ou_machines,$basedn";
				my $winmagic=2147483647;
				my $userRid = 2 * $uidNumber + 1000;
				my $userGroupRid = 2 * $gidNumber + 1001;

				# Calcul du mot de passe LanManager et du mot de passe NT
				# a l'aide de l'outil mkntpasswd (source LophtCrack)
				my $pass=$uid;
				$pass=~ s/.$//s;
				print("pass=$pass\n");
				my $ntpwd=`$mk_ntpasswd '$pass'`;
				chomp(my $lmpassword=substr($ntpwd,0,index($ntpwd,':')));
				chomp(my $ntpassword=substr($ntpwd,index($ntpwd,':')+1));
			
				# Mise a jour du samba home
				$home_rep_samba="$home_rep_samba\\nobody";
				print("home_rep=$home_rep_samba\n");
				# Mise a jour du samba profile
				$profile_rep_samba="$profile_rep_samba\\nobody\\profile";
				print("home_rep=$profile_rep_samba\n");
    			my $res = $ldap->add(dn=>$dn, 
					 attrs =>
					 [ "objectclass" => [ 'posixAccount', 'top', 'sambaAccount' ],
				   "uid" => [ $uid ],
				   "cn" => [ $uid ],
				   "loginShell" => [ $login_shell ],
				   "uidNumber" => [ $uidNumber ],
				   "gidNumber" => [ $gidNumber ],
				   "homeDirectory" => [ $home_rep ],
				   "description" => [ "Ordinateur SAMBA $pass" ],
				   "pwdLastSet" => [ '0' ],
				   "logonTime" => [ '0' ],
				   "logoffTime" => [ $winmagic ],
				   "kickoffTime" => [ $winmagic ],
				   "pwdCanChange" => [ '0' ],
				   "pwdMustChange" => [ $winmagic ],
				   "acctFlags" => [ '[W        ]' ],
				   "rid" => [ $userRid ],
				   "primaryGroupID" => [ $userGroupRid ],
				   "smbHome" => [ $home_rep_samba ],
				   "lmPassword" => [ $lmpassword ],
				   "ntPassword" => [ $ntpassword ],
				   "profilePath" => [ $profile_rep_samba ]
				   ]);
    			$res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;
				last SWITCH;
			}

		if ($type_creation =~ "samba") 
			{
				my $winmagic=2147483647;
				# Calcul du rid de l'utilisateur et du primaryGroupId
				# userRid=2*uidNumber + 1000
				# groupId=2*gidNumber + 1001
				my $userRid = 2 * $uidNumber + 1000;
				my $userGroupRid = 2 * $gidNumber + 1001;

				# Calcul du mot de passe LanManager et du mot de passe NT
				# a l'aide de l'outil mkntpasswd (source LophtCrack)
				my $ntpwd=`$mk_ntpasswd '$pass'`;
				chomp(my $lmpassword=substr($ntpwd,0,index($ntpwd,':')));
				chomp(my $ntpassword=substr($ntpwd,index($ntpwd,':')+1));
    			my $res = $ldap->add(dn=>$dn, 
					 attrs =>
					 [ "objectclass" => [ 'InetOrgPerson', 'account', 'posixAccount', 'top', 'shadowaccount', 'sambaAccount' ],
				   "uid" => [ $uid ],
				   "cn" => [ $uid ],
				   "sn" => [ $sn ],
				   "gecos" => [ $uid ],
				   "description" => [ "Utilisateur SAMBA $sn" ],
				   "pwdLastSet" => [ '0' ],
				   "logonTime" => [ '0' ],
				   "logoffTime" => [ $winmagic ],
				   "kickoffTime" => [ $winmagic ],
				   "pwdCanChange" => [ '0' ],
				   "pwdMustChange" => [ $winmagic ],
				   "displayName" => [ $uid ],
				   "acctFlags" => [ '[UX       ]' ],
				   "rid" => [ $userRid ],
				   "primaryGroupID" => [ $userGroupRid ],
				   "smbHome" => [ $home_rep_samba ],
				   "lmPassword" => [ $lmpassword ],
				   "ntPassword" => [ $ntpassword ],
				   "homeDrive" => [ $home_drive_samba ],
				   "profilePath" => [ $profile_rep_samba ]
				   ]);
    			$res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;
				last SWITCH;
			}

		if ($type_creation =~ "unix") 
			{
    			my $res = $ldap->add(dn=>$dn, 
					 attrs =>
					 [ "objectclass" => [ 'InetOrgPerson', 'account', 'posixAccount', 'top', 'shadowaccount' ],
				   "uid" => [ $uid ],
				   "cn" => [ $uid ],
				   "sn" => [ $sn ],
				   "userPassword" => [ $userpassword ],
				   "shadowLastChange" => [ $shadow_lastchange ],
				   "shadowMax" => [ $shadow_max ],
				   "shadowWarning" => [ $shadow_warning ],
				   "loginShell" => [ $login_shell ],
				   "uidNumber" => [ $uidNumber ],
				   "gidNumber" => [ $gidNumber ],
				   "homeDirectory" => [ $home_rep ],
				   "gecos" => [ $uid ]]);
    			$res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;
				last SWITCH;
			}
	}
}

close(FILE);

#!/usr/bin/perl -w
#
# Script permettant de creer les groupes utilisateurs dans l'annuaire LDAP
# Copyright marc.boget@gendarmerie.org
# Script fonctionnant de pair avec le script maitre gestion_ldap

#use strict;
use Net::LDAP;

# Recuperation des variables environnements exportes par gestion_ldap
my $serveur=$ENV{"SERVEUR"};
my $binddn=$ENV{"BINDDN"};
my $basedn=$ENV{"BASEDN"};
my $password=$ENV{"PASSWORD"};
my $ou_groups=$ENV{"OU_GROUPS"};
my $fichier_travail=$ENV{"FICHIER_TEMP_GROUPS"};

# Ouverture de la connexion sur l'annuaire LDAP
my $ldap = Net::LDAP->new($serveur, async => 1) or die "$@";

# on se connecte avec le BINDDN
$ldap->bind(dn=>$binddn,
	    password=>$password)  or die "$@";

# on lit un fichier qui contient les groupes à créer dans l'annuaire
open (FILE, "<$fichier_travail");

my $line;
while (defined ($line = <FILE>))
{
    chomp($line);
    if ($line =~ /^\s*$/)
    {
	next;
    }
    my ($gid, $gidNumber) = split(/:/, $line);
    my $dn = "cn=$gid,$ou_groups,$basedn";
    my $res = $ldap->add(dn=>$dn, 
			 attrs =>
			 [ "objectclass" => [ 'posixGroup', 'top' ],
			   "cn" => [ $gid ],
			   "gidNumber" => [ $gidNumber ]]);

    $res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;
}

close(FILE);

#!/usr/bin/perl -w
#
# Script permettant de creer les utilisateurs de /etc/passwd 
# dans l'annuaire LDAP
# Copyright marc.boget@gendarmerie.org
# Script fonctionnant de pair avec le script maitre gestion_ldap

#use strict;
use Net::LDAP;

# Recuperation des variables environnements exportes par gestion_ldap
my $serveur=$ENV{"SERVEUR"};
my $binddn=$ENV{"BINDDN"};
my $basedn=$ENV{"BASEDN"};
my $password=$ENV{"PASSWORD"};
my $ou_users=$ENV{"OU_USERS"};
my $fichier_travail=$ENV{"FICHIER_TEMP_USERS"};
my $shadow_lastchange="11111";
my $shadow_max="99999";
my $shadow_warning="7";
 
# Ouverture de la connexion sur l'annuaire LDAP
my $ldap = Net::LDAP->new($serveur, async => 1) or die "$@";

# on se connecte avec le BINDDN
$ldap->bind(dn=>$binddn,
	    password=>$password)  or die "$@";

# on lit un fichier qui contient les personnes à créer dans l'annuaire
open (FILE, "<$fichier_travail");

my $line;
while (defined ($line = <FILE>))
{
    chomp($line);
    if ($line =~ /^\s*$/)
    {
	next;
    }
    my ($uid, $uidNumber, $gidNumber, $pass, $sn, $home_rep, $login_shell) = split(/:/, $line);
    my $dn = "uid=$uid,$ou_users,$basedn";
    my $userpassword="{crypt}$pass";
    my $res = $ldap->add(dn=>$dn, 
			 attrs =>
			 [ "objectclass" => [ 'InetOrgPerson', 'account', 'posixAccount', 'top', 'shadowaccount' ],
			   "uid" => [ $uid ],
			   "cn" => [ $uid ],
			   "sn" => [ $sn ],
			   "userPassword" => [ $userpassword ],
			   "shadowLastChange" => [ $shadow_lastchange ],
			   "shadowMax" => [ $shadow_max ],
			   "shadowWarning" => [ $shadow_warning ],
			   "loginShell" => [ $login_shell ],
			   "uidNumber" => [ $uidNumber ],
			   "gidNumber" => [ $gidNumber ],
			   "homeDirectory" => [ $home_rep ],
			   "gecos" => [ $uid ]]);

    $res->code && warn "Erreur lors de l'ajout de l'entrée : ", $res->error ;
}

close(FILE);

Précedent Suivant Titre Sommaire